import re

from datetime import datetime

from flask import current_app
from flask import request, jsonify

from business import db
from business.models import Member, OrderOnline
from business.modules.business_area import business_area_blu
from business.utils.response_code import RET


@business_area_blu.route('/register', methods=["POST"])
def register():
    """
    注册的逻辑
    1. 获取参数
    2. 校验参数
    3. 如果一致，初始化 Member 模型，并且赋值属性
    4. 将 member 模型添加数据库
    5. 返回响应
    :return:
    """
    # 1. 获取参数
    param_dict = request.json
    username = param_dict.get("username")
    password = param_dict.get("password")
    password2 = param_dict.get("password2")
    member_type = param_dict.get("member_type")
    company_name = param_dict.get("company_name")
    location = param_dict.get("location")
    email = param_dict.get("email")
    mobile = param_dict.get("mobile")
    gender = param_dict.get("gender")

    # 2. 校验参数
    # 用户名
    if not re.match(r'^\w{6,20}$', username):
        return jsonify(errno=RET.PARAMERR, errmsg="用户名不正确")

    # 密码
    if not re.match(r'^[\w!@#$%^&*]{6,20}$', password):
        return jsonify(errno=RET.PARAMERR, errmsg="密码格式不正确")

    if not password == password2:
        return jsonify(errno=RET.PARAMERR, errmsg="两次密码不一样")

    # 公司名
    if not company_name:
        return jsonify(errno=RET.PARAMERR, errmsg="公司名为空")

    # 邮箱
    if not re.match(r'^[a-z0-9][\w\.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$', email):
        return jsonify(errno=RET.PARAMERR, errmsg="邮箱格式不正确")

    # 校验手机号是否正确
    if not re.match(r'1[35678]\\d{9}', mobile):
        return jsonify(errno=RET.PARAMERR, errmsg="手机号格式不正确")


    # 5. 如果一致，初始化 Member 模型，并且赋值属性
    member = Member()
    member.username = username
    member.member_type = member_type
    member.company_name = company_name
    member.location = location
    member.mobile = mobile
    member.email = email
    member.gender = gender
    member.last_login = datetime.now()
    # 对密码做处理
    # 需求：在设置 password 的时候，去对 password 进行加密，并且将加密结果给 Member.password_hash 赋值
    member.password = password

    # 6. 添加到数据库
    try:
        db.session.add(member)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg="数据保存失败")


    # 7. 返回响应
    return jsonify(errno=RET.OK, errmsg="注册成功")


# 在线订购
@business_area_blu.route('/order', methods=["POST"])
def order():
    """
    订单
    1. 获取参数
    2. 校验参数
    3. 如果一致，初始化 OrderOnline 模型，并且赋值属性
    4. 将 ordernnline 模型添加数据库
    5. 返回响应
    :return:
    """
    # 1. 获取参数
    param_dict = request.json
    product_name = param_dict.get("product_name")
    product_number = param_dict.get("product_number")
    user_name = param_dict.get("user_name")
    gender = param_dict.get("gender")
    mobile = param_dict.get("mobile")
    postalcode = param_dict.get("postalcode")
    telephone = param_dict.get("telephone")
    email = param_dict.get("email")
    address = param_dict.get("address")
    remark = param_dict.get("remark")

    # 2. 校验参数
    # 用户名
    if not product_name:
        return jsonify(errno=RET.PARAMERR, errmsg="产品名不正确")

    # 密码
    if not product_number:
        return jsonify(errno=RET.PARAMERR, errmsg="产品数量不正确")

    if not user_name:
        return jsonify(errno=RET.PARAMERR, errmsg="收货姓名不正确")

    if not gender:
        return jsonify(errno=RET.PARAMERR, errmsg="性别不正确")

    # 校验手机号是否正确
    if not re.match(r'1[35678]\\d{9}', mobile):
        return jsonify(errno=RET.PARAMERR, errmsg="手机号格式不正确")

    # 邮箱
    if not re.match(r'^[a-z0-9][\w\.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$', email):
        return jsonify(errno=RET.PARAMERR, errmsg="邮箱格式不正确")

    if not postalcode:
        return jsonify(errno=RET.PARAMERR, errmsg="邮编格式不正确")

    if not telephone:
        return jsonify(errno=RET.PARAMERR, errmsg="固定电话格式不正确")

    if not address:
        return jsonify(errno=RET.PARAMERR, errmsg="地址格式不正确")

    if not remark:
        return jsonify(errno=RET.PARAMERR, errmsg="其他说明不正确")




    # 5. 如果一致，初始化 Member 模型，并且赋值属性
    ordernnline = OrderOnline()
    ordernnline.product_name = product_name
    ordernnline.product_number = product_number
    ordernnline.user_name = user_name
    ordernnline.gender = gender
    ordernnline.mobile = mobile
    ordernnline.email = email
    ordernnline.postalcode = postalcode
    ordernnline.telephone = telephone
    ordernnline.address = address
    ordernnline.remark = remark
    ordernnline.last_login = datetime.now()


    # 6. 添加到数据库
    try:
        db.session.add(ordernnline)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg="数据保存失败")


    # 7. 返回响应
    return jsonify(errno=RET.OK, errmsg="提交成功")